package com.dynamicPro.estadisticas;

import java.io.BufferedReader;
import java.io.File;
import java.io.FileReader;
import java.util.ArrayList;
import java.util.List;

import com.dynamicPro.pojo.EstadisticasPrograma;

/**
 * Esta clase calcula las estadisticas de una version de un programa analizado
 * @author Marcel cordoba
 *
 */
public class Estadisticas {
	
	private int totalAgregadas;
	private int totalEliminadas;
	private static final String LOC_TOTALES="LOC Totales:";
	private static final String LOC_ADICIONADO="LOC Adicionado:";
	private static final String LOC_ELIMINADO="LOC Eliminado:";
	private static final String MENSAJE_ERROR="Error al leer el historial de versiones";
	private static final String FECHA="Fecha:";

	
	public Estadisticas(){
		
	}
	
	public List<EstadisticasPrograma> calcularPorcentajes(String rutaArchivo){
		
		List<EstadisticasPrograma> resultado = new ArrayList<EstadisticasPrograma>();
		this.totalAgregadas=0;
		this.totalEliminadas=0;
		File archivo = null;
		FileReader fr=null;
		BufferedReader br = null;
		
		try {
			archivo = new File (rutaArchivo);
			int total = calcularAcumulados(archivo);
			fr = new FileReader (archivo);
			br = new BufferedReader(fr);
			String linea;
			String fecha="";
			int adicionadas=0;
			int eliminadas=0;
			int locTotal=0;
			double porcentajeLoc=0;
			double porcentajeLocAgregadas=0;
			double porcentajeLocEliminadas=0;
			
	        while((linea=br.readLine())!=null){
	        	
	        	if(linea.contains("**/")){
	        		  porcentajeLoc=((double)locTotal/(double)total) * (100); 
	        		  porcentajeLocAgregadas=((double)adicionadas/(double)this.totalAgregadas) * 100;
	        		  porcentajeLocEliminadas=((double)eliminadas/(double)this.totalEliminadas) * 100;
	        		  
	        		  EstadisticasPrograma versionObj = new EstadisticasPrograma(
	        				  fecha, "nombre", locTotal, 
	        				  adicionadas, eliminadas, porcentajeLoc, 
	        				  porcentajeLocAgregadas, porcentajeLocEliminadas);
	        		  
	        		  resultado.add(versionObj);
	        	  }  
	        	
	        	if(linea.contains("/**")){
	        		  locTotal=0;
	        		  adicionadas=0;
	      			  eliminadas=0;
	      			  porcentajeLoc=0;
	      			  porcentajeLocAgregadas=0;
	      			  porcentajeLocEliminadas=0;
	        	  }
	        	  
	        	  if(linea.contains(FECHA)){
	        		  fecha=linea.replace(FECHA, "").trim(); 
	        	  }
	        	  if(linea.contains(LOC_ADICIONADO)){
	        		  adicionadas=Integer.parseInt(linea.replace(LOC_ADICIONADO, "").trim()); 
	        	  }
	        	  
	        	  if(linea.contains(LOC_ELIMINADO)){
	        		  eliminadas=Integer.parseInt(linea.replace(LOC_ELIMINADO, "").trim()); 
	        	  }
	        	  
	        	  if(linea.contains(LOC_TOTALES)){
	        		  locTotal=Integer.parseInt(linea.replace(LOC_TOTALES, "").trim()); 
	        	  }
	        }
			
		}catch(Exception e){
			e.printStackTrace();
	           System.out.println(MENSAJE_ERROR);
	    }finally{

	           try{                    
	              if( null != fr ){   
	                 fr.close();     
	              }
	              
	           }catch (Exception e2){ 
	        	   e2.printStackTrace();
	        	   System.out.println(MENSAJE_ERROR);
	           }
	    }
		
		return resultado;
	}
	
	private int calcularAcumulados(File archivo){
		int locTotal=0;
		if(null!=archivo){
			
			FileReader fr=null;
			BufferedReader br=null;
			
			try {
				fr = new FileReader (archivo);
				br = new BufferedReader(fr);
				
				String linea;
		        while((linea=br.readLine())!=null){
		        	
		        	  if(linea.contains(LOC_TOTALES)){
		        		  locTotal= locTotal + Integer.parseInt(linea.replace(LOC_TOTALES, "").trim()); 
		        	  }
		        	  
		        	  if(linea.contains(LOC_ADICIONADO)){
		        		  this.totalAgregadas=this.totalAgregadas+Integer.parseInt(linea.replace(LOC_ADICIONADO, "").trim());
		        	  }
		        	  
		        	  if(linea.contains(LOC_ELIMINADO)){
		        		  this.totalEliminadas=this.totalAgregadas+Integer.parseInt(linea.replace(LOC_ELIMINADO, "").trim()); 
		        	  }
		        }
			} catch (Exception e) {
				e.printStackTrace();
				System.out.println(MENSAJE_ERROR);
			}finally{

		           try{                    
		              if( null != fr ){   
		                 fr.close();     
		              }                  
		           }catch (Exception e2){ 
		        	   e2.printStackTrace();
		        	   System.out.println(MENSAJE_ERROR);
		           }
		    }
			
		}
		return locTotal;
	}
	
	/*public static void main(String[] args) {
		Estadisticas est = new Estadisticas();
		String Filename = ".//testFiles//cambios.txt";
		List<EstadisticasPrograma> resultado = est.calcularPorcentajes(Filename);
		for(EstadisticasPrograma p:resultado){
			System.out.println("----------------------");
			System.out.println("version="+p.getVersion());
			System.out.println("loc totales="+p.getLoc());
			System.out.println("loc adicionadas="+p.getLocAgregadas());
			System.out.println("loc eliminadas="+p.getLocEliminadas());
			System.out.println("%loc totales="+p.getPorcentajeLoc());
			System.out.println("%loc adicionadas="+p.getPorcentajeLocAgregadas());
			System.out.println("%loc eliminadas="+p.getPorcentajeLocEliminadas());
			System.out.println("----------------------");
		}
	}*/
	
	
}
